#!/bin/bash

# AIQuant 系统启动脚本
# 用于启动完整的AIQuant量化投研系统

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查Python
    if ! command -v python3 &> /dev/null; then
        log_error "Python 3 未安装"
        exit 1
    fi
    
    # 检查pip
    if ! command -v pip3 &> /dev/null; then
        log_error "pip3 未安装"
        exit 1
    fi
    
    # 检查虚拟环境
    if [[ "$VIRTUAL_ENV" == "" ]]; then
        log_warning "建议在虚拟环境中运行"
    fi
    
    log_success "依赖检查完成"
}

# 安装Python依赖
install_dependencies() {
    log_info "安装Python依赖..."
    
    if [ -f "requirements.txt" ]; then
        pip3 install -r requirements.txt
        log_success "Python依赖安装完成"
    else
        log_warning "requirements.txt 文件不存在"
    fi
}

# 初始化数据库
init_database() {
    log_info "初始化数据库..."
    
    # 检查数据库连接
    python3 -c "
import sys
sys.path.append('.')
from aiquant.database.connection import DatabaseManager
try:
    db = DatabaseManager()
    db.test_connection()
    print('数据库连接成功')
except Exception as e:
    print(f'数据库连接失败: {e}')
    sys.exit(1)
"
    
    if [ $? -eq 0 ]; then
        log_success "数据库初始化完成"
    else
        log_error "数据库初始化失败"
        exit 1
    fi
}

# 启动Redis
start_redis() {
    log_info "检查Redis服务..."
    
    # 检查Redis是否运行
    if ! pgrep -x "redis-server" > /dev/null; then
        log_info "启动Redis服务..."
        if command -v redis-server &> /dev/null; then
            redis-server --daemonize yes
            sleep 2
            log_success "Redis服务启动成功"
        else
            log_warning "Redis未安装，某些功能可能受限"
        fi
    else
        log_success "Redis服务已运行"
    fi
}

# 启动API服务
start_api() {
    log_info "启动AIQuant API服务..."
    
    export PYTHONPATH="${PYTHONPATH}:$(pwd)"
    
    # 检查端口是否被占用
    if lsof -Pi :8000 -sTCP:LISTEN -t >/dev/null ; then
        log_warning "端口8000已被占用，尝试终止现有进程..."
        pkill -f "uvicorn.*aiquant.api.main:app" || true
        sleep 2
    fi
    
    # 启动API服务
    nohup uvicorn aiquant.api.main:app \
        --host 0.0.0.0 \
        --port 8000 \
        --reload \
        --log-level info \
        > logs/api.log 2>&1 &
    
    API_PID=$!
    echo $API_PID > .api.pid
    
    # 等待服务启动
    sleep 5
    
    # 检查服务是否启动成功
    if curl -f http://localhost:8000/health > /dev/null 2>&1; then
        log_success "API服务启动成功 (PID: $API_PID)"
    else
        log_error "API服务启动失败"
        exit 1
    fi
}

# 启动Web界面
start_web() {
    log_info "启动AIQuant Web界面..."
    
    # 检查端口是否被占用
    if lsof -Pi :8501 -sTCP:LISTEN -t >/dev/null ; then
        log_warning "端口8501已被占用，尝试终止现有进程..."
        pkill -f "streamlit.*aiquant/web/dashboard.py" || true
        sleep 2
    fi
    
    # 启动Web界面
    nohup streamlit run aiquant/web/dashboard.py \
        --server.port 8501 \
        --server.address 0.0.0.0 \
        --server.headless true \
        --browser.gatherUsageStats false \
        > logs/web.log 2>&1 &
    
    WEB_PID=$!
    echo $WEB_PID > .web.pid
    
    # 等待服务启动
    sleep 5
    
    # 检查服务是否启动成功
    if curl -f http://localhost:8501 > /dev/null 2>&1; then
        log_success "Web界面启动成功 (PID: $WEB_PID)"
    else
        log_error "Web界面启动失败"
        exit 1
    fi
}

# 启动后台任务
start_background_tasks() {
    log_info "启动后台任务..."
    
    # 启动数据收集器
    nohup python3 -m aiquant.market_observation.data_collector > logs/data_collector.log 2>&1 &
    echo $! > .data_collector.pid
    
    # 启动市场监控器
    nohup python3 -m aiquant.market_observation.market_monitor > logs/market_monitor.log 2>&1 &
    echo $! > .market_monitor.pid
    
    # 启动异常检测器
    nohup python3 -m aiquant.market_observation.anomaly_detector > logs/anomaly_detector.log 2>&1 &
    echo $! > .anomaly_detector.pid
    
    log_success "后台任务启动完成"
}

# 显示系统状态
show_status() {
    log_info "系统状态:"
    echo "=================================="
    echo "API服务: http://localhost:8000"
    echo "Web界面: http://localhost:8501"
    echo "API文档: http://localhost:8000/docs"
    echo "健康检查: http://localhost:8000/health"
    echo "=================================="
    
    if [ -f ".api.pid" ]; then
        API_PID=$(cat .api.pid)
        if ps -p $API_PID > /dev/null; then
            echo "API服务运行中 (PID: $API_PID)"
        else
            echo "API服务未运行"
        fi
    fi
    
    if [ -f ".web.pid" ]; then
        WEB_PID=$(cat .web.pid)
        if ps -p $WEB_PID > /dev/null; then
            echo "Web服务运行中 (PID: $WEB_PID)"
        else
            echo "Web服务未运行"
        fi
    fi
}

# 创建日志目录
create_log_dir() {
    if [ ! -d "logs" ]; then
        mkdir -p logs
        log_info "创建日志目录"
    fi
}

# 主函数
main() {
    log_info "启动AIQuant量化投研系统..."
    
    create_log_dir
    check_dependencies
    install_dependencies
    start_redis
    init_database
    start_api
    start_web
    start_background_tasks
    
    log_success "AIQuant系统启动完成!"
    show_status
    
    log_info "使用 './scripts/stop.sh' 停止系统"
    log_info "使用 './scripts/status.sh' 查看系统状态"
}

# 处理中断信号
trap 'log_warning "接收到中断信号，正在停止..."; ./scripts/stop.sh; exit 0' INT TERM

# 检查参数
case "${1:-}" in
    --help|-h)
        echo "AIQuant系统启动脚本"
        echo "用法: $0 [选项]"
        echo "选项:"
        echo "  --help, -h     显示帮助信息"
        echo "  --dev          开发模式启动"
        echo "  --prod         生产模式启动"
        exit 0
        ;;
    --dev)
        export ENVIRONMENT=development
        log_info "开发模式启动"
        ;;
    --prod)
        export ENVIRONMENT=production
        log_info "生产模式启动"
        ;;
    "")
        export ENVIRONMENT=development
        ;;
    *)
        log_error "未知参数: $1"
        echo "使用 --help 查看帮助信息"
        exit 1
        ;;
esac

# 执行主函数
main